在Golang中实现模板方法模式的优雅方式 您所在的位置:网站首页 golang for循环 在Golang中实现模板方法模式的优雅方式

在Golang中实现模板方法模式的优雅方式

2023-03-15 00:13| 来源: 网络整理| 查看: 265

在Go中实现模板方法模式是否有一种优雅的规范方法?在C++中,它看起来像这样:

#include #include class Runner { public: void Start() { // some prepare stuff... Run(); } private: virtual void Run() = 0; }; class Logger : public Runner { private: virtual void Run() override { std::cout l = std::make_unique(); l->Start(); return 0; }

在golang我写了这样的东西:

package main import ( "fmt" "time" ) type Runner struct { doRun func() needStop bool } func (r *Runner) Start() { go r.doRun() } func NewRunner(f func()) *Runner { return &Runner{f, false} } type Logger struct { *Runner i int } func NewLogger() *Logger { l := &Logger{} l.doRun = l.doRunImpl return l } func (l *Logger) doRunImpl() { time.Sleep(1 * time.Second) fmt.Println("Running") } func main() { l := NewLogger() l.Start() fmt.Println("Hello, playground") }

但是此代码因运行时空指针错误而失败.基本思想是将一些功能从派生类(结构化)混合到基类例程,其方式是从这个混合派生例程中获得基类状态.

1> Chris Drew..:

模板方法模式的本质是,它允许您将一个或多个特定函数的实现注入到算法的框架中。

您可以通过在Go中注入一个函数或接口来在Go中实现这一目标Runner。要实现基本的模板方法模式,您实际上根本不需要Logger结构:

package main import ( "fmt" ) type Runner struct { run func() } func (r *Runner) Start() { // some prepare stuff... r.run() } func runLog() { fmt.Println("Running") } func NewLogger() *Runner { return &Runner{runLog} } func main() { l := NewLogger() l.Start() }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有